import XLSTYLE from "xlsx-js-style";
// 对象，用于调用方法
var dataConversionUtil = {};

// 将数据转换成Excel，单个sheet保存
//fileName文件名,tableHeader表头,dataList表数据,sheet="sheet1"工作表默认名字是sheet1
dataConversionUtil.dataToExcel = function(fileName,tableHeader,dataList,sheet="sheet1"){
  let workBook = XLSTYLE.utils.book_new();
  // excel的表头和数据
  let aoa = [];
  // aoa的数据格式：[[],[],[],[]]   数组的第一个子数组可以指定为表头  根据情况而定
  aoa = tableHeader.concat(dataList);

  let workSheet = XLSTYLE.utils.aoa_to_sheet(aoa);


  // workSheet['!merges'] = mergeData // 合并标题单元格

  // 设置表头单元格的样式
  const titleStyle = {
    font: { bold: true, sz: 12, color: { rgb: '000000' } },
    fill: {
      fgColor: { rgb: 'F3F7FC' }
    },
    border: {
      top: { style: 'thin', color: { rgb: 'B9B9B9' } },
      bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
      left: { style: 'thin', color: { rgb: 'B9B9B9' } },
      right: { style: 'thin', color: { rgb: 'B9B9B9' } }
    },
    alignment: { horizontal: 'center', vertical: 'center', wrapText: false },
  }

  // 设置表内容单元格的样式
  const defaultStyle = {
    alignment: { horizontal: 'center', vertical: 'center', wrapText: true },
    border: {
      top: { style: 'thin', color: { rgb: 'B9B9B9' } },
      bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
      left: { style: 'thin', color: { rgb: 'B9B9B9' } },
      right: { style: 'thin', color: { rgb: 'B9B9B9' } }
    },
  }

  // 设置单元格样式，添加超链接
  const hyperlinkStyle = {
    alignment: { horizontal: 'center', vertical: 'center', wrapText: false },
    font: { color: { rgb: '0563C1' } }, // 超链接的字体颜色
    fill: { fgColor: { rgb: 'FFFFFF' } }, // 背景颜色
    border: { 
      top: { style: 'thin', color: { rgb: 'B9B9B9' } },
      bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
      left: { style: 'thin', color: { rgb: 'B9B9B9' } },
      right: { style: 'thin', color: { rgb: 'B9B9B9' } }
    }
  };

  let sheetWidth = []
  for (let key in workSheet) {
    if (key !== '!merges' && key !== '!ref') {
      sheetWidth.push({ wpx: 150 })
    }
  }
  workSheet["!cols"] = sheetWidth

  for (let key in workSheet) {
    if(key !== '!merges' && key !== '!ref'){
      if(specificNumber(key,1)){
        workSheet[key].s = titleStyle
      }else{
        workSheet[key].s = defaultStyle;
      }
    }
  }
 
  // 如果某个单元格有url，既当前单元格设置跳转
  const range = XLSTYLE.utils.decode_range(workSheet['!ref']);
  for (let col = range.s.c; col <= range.e.c; col++) {
    for (let row = range.s.r; row <= range.e.r; row++) {
      const cellAddress = XLSTYLE.utils.encode_cell({ c: col, r: row });

      if (workSheet[cellAddress]) { // 确保单元格存在
        const cellValue = workSheet[cellAddress].v;
        // 如果单元格值是有效的URL，则设置超链接
        
        if (isUrl(cellValue)) {
          workSheet[cellAddress].l = { Target: cellValue }; // 设置跳转的链接
          workSheet[cellAddress].v = "查看"; // 设置显示的文本
          workSheet[cellAddress].s = hyperlinkStyle; // 设置样式
        }
      }
    }
  }

  // 把数据写到工作簿中
  XLSTYLE.utils.book_append_sheet(workBook,workSheet,fileName)
  //如果一个工作工作簿中有多个工作表，可以修改参数类型并遍历添加，期中workBook是同一个，workSheet和sheet根据自己的需求添加，
  //比如在此处添加第二个工作表叫‘第二张表’，把数据封装好后，数据格式同上,假如数据叫workSheet2，执行下面代码，工作簿就会多一张工作表叫‘第二张表’
  //XLSTYLE.utils.book_append_sheet(workBook,workSheet2,'第二张表')
 
  //保存
  XLSTYLE.writeFile(workBook, fileName + ".xlsx")
 
}



// 将数据转换成Excel，多个sheets保存
dataConversionUtil.dataToExcelWithMultipleSheets = function (fileName, sheetsData) {
  let workBook = XLSTYLE.utils.book_new();

  for (let sheetName in sheetsData) {
    let sheetData = sheetsData[sheetName];
    let aoa = [];
    if (Array.isArray(sheetData.tableHeader)) {
      aoa = sheetData.tableHeader.concat(sheetData.dataList);
    } else {
      aoa = sheetData.dataList;
    }

    // 多级表头功能操作
    if (sheetData.isMultistage) {
      let exportHead = [[]]
      sheetData.tableHeader.forEach(item => {
        if (item.subTitle) {
          exportHead[0].push(item.title)
          for (let i = 0; i < item.subTitle.length - 1; i++) {
            exportHead[0].push('')
          }
        } else {
          exportHead[0].push(item.title)
        }

      })

      let subTitleList = []
      sheetData.tableHeader.forEach(item => {
        if (!item.subTitle) {
          subTitleList.push('')
        } else {
          subTitleList.push(...item.subTitle)
        }
      })
      exportHead.push(subTitleList)
      if (sheetData.dataList && sheetData.dataList.length > 0) {
        sheetData.dataList.forEach(item => {
          exportHead.push(item);
        })
      }

      aoa = exportHead
    }

    
    // 添加标题行
    aoa.unshift([sheetData.title]);

    let workSheet = XLSTYLE.utils.aoa_to_sheet(aoa);
    if (sheetData.tableHeader && sheetData.tableHeader.length > 0) {
      // 标题合并单元格操作
      let mergeLength = sheetData.tableHeader.filter(item => !item.subTitle)
      let mergeData = [{ s: { r: 0, c: 0 }, e: { r: 0, c: sheetData.tableHeader[sheetData.tableHeader.length - 1].length - 1 } }] // 合并数据
      
      // 多级表头功能操作
      if (sheetData.isMultistage) {
        // 左右合并主标题
        // 1、将表头数据调整为合适的数据
        let newHeaderData = []
        sheetData.tableHeader.forEach(item => {
          newHeaderData.push(item)
          if (item.subTitle) {
            for (let i = 0; i < item.subTitle.length - 1; i++) {
              newHeaderData.push('')
            }
          }
        })
        mergeData = [{ s: { r: 0, c: 0 }, e: { r: 0, c: newHeaderData.length - 1 } }]
        // 上下合并标题
        for (let i = 0; i < mergeLength.length; i++) {
          // 设置合并区域
          mergeData.push({ s: { r: 1, c: i }, e: { r: 2, c: i } })
        }
        // 2、合并左右相对应单元格主标题与子标题相对应
        newHeaderData.forEach((item, index) => {
          if (item.subTitle) {
            mergeData.push({ s: { r: 1, c: index }, e: { r: 1, c: index + item.subTitle.length - 1 } })
          }
        })
      }


      workSheet['!merges'] = mergeData
      // 设置A1标题单元格的样式
      const cellStyle = {
        font: { bold: true, sz: 17, color: { rgb: '000000' } },
        fill: {
          fgColor: { rgb: 'F3F7FC' }
        },
        border: {
          top: { style: 'thin', color: { rgb: 'B9B9B9' } },
          bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
          left: { style: 'thin', color: { rgb: 'B9B9B9' } },
          right: { style: 'thin', color: { rgb: 'B9B9B9' } }
        },
        alignment: { horizontal: 'center', vertical: 'center', wrapText: false },
      };

      // 设置表头单元格的样式
      const titleStyle = {
        font: { bold: true, sz: 12, color: { rgb: '000000' } },
        fill: {
          fgColor: { rgb: 'F3F7FC' }
        },
        border: {
          top: { style: 'thin', color: { rgb: 'B9B9B9' } },
          bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
          left: { style: 'thin', color: { rgb: 'B9B9B9' } },
          right: { style: 'thin', color: { rgb: 'B9B9B9' } }
        },
        alignment: { horizontal: 'center', vertical: 'center', wrapText: false },
      }

      // 设置表内容单元格的样式
      const defaultStyle = {
        alignment: { horizontal: 'center', vertical: 'center', wrapText: true },
        border: {
          top: { style: 'thin', color: { rgb: 'B9B9B9' } },
          bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
          left: { style: 'thin', color: { rgb: 'B9B9B9' } },
          right: { style: 'thin', color: { rgb: 'B9B9B9' } }
        },
      }

      // 设置单元格样式，添加超链接
      const hyperlinkStyle = {
        alignment: { horizontal: 'center', vertical: 'center', wrapText: false },
        font: { color: { rgb: '0563C1' } }, // 超链接的字体颜色
        fill: { fgColor: { rgb: 'FFFFFF' } }, // 背景颜色
        border: { 
          top: { style: 'thin', color: { rgb: 'B9B9B9' } },
          bottom: { style: 'thin', color: { rgb: 'B9B9B9' } },
          left: { style: 'thin', color: { rgb: 'B9B9B9' } },
          right: { style: 'thin', color: { rgb: 'B9B9B9' } }
        }
      };
      

      let sheetWidth = []

      for (let key in workSheet) {
        if (key !== '!merges' && key !== '!ref') {
          // 多级表头功能操作
          if (sheetData.isMultistage) {

            if (specificNumber(key, 1)) {
              workSheet[key].s = cellStyle;
            } else if (specificNumber(key, 2) || specificNumber(key, 3)) {
              workSheet[key].s = titleStyle
            } else {
              workSheet[key].s = defaultStyle;
            }

          } else {
            // 普通表头功能操作
            if (specificNumber(key, 1)) {
              workSheet[key].s = cellStyle;
            } else if (specificNumber(key, 2)) {
              workSheet[key].s = titleStyle
            } else {
              workSheet[key].s = defaultStyle;
            }

          }
          sheetWidth.push({ wpx: 150 })
        }
      }
      workSheet["!cols"] = sheetWidth


      // 如果某个单元格有url，既当前单元格设置跳转
      const range = XLSTYLE.utils.decode_range(workSheet['!ref']);
      for (let col = range.s.c; col <= range.e.c; col++) {
        for (let row = range.s.r; row <= range.e.r; row++) {
          const cellAddress = XLSTYLE.utils.encode_cell({ c: col, r: row });

          if (workSheet[cellAddress]) { // 确保单元格存在
            const cellValue = workSheet[cellAddress].v;
            // 如果单元格值是有效的URL，则设置超链接
            if (isUrl(cellValue)) {
              workSheet[cellAddress].l = { Target: cellValue }; // 设置跳转的链接
              workSheet[cellAddress].v = "查看"; // 设置显示的文本
              workSheet[cellAddress].s = hyperlinkStyle; // 设置样式
            }
          }
        }
      }
    }

    XLSTYLE.utils.book_append_sheet(workBook, workSheet, sheetName);
  }
  // 保存
  XLSTYLE.writeFile(workBook, fileName + ".xlsx");
};

// 检测字符串是否包含的数字是否 === 传入的数字
function specificNumber(str, num) {
  const regex = /\d+/;
  const match = str.match(regex);
  const strNum = match ? Number(match[0]) : null;
  return strNum === num;
}

// 验证是否为URL
function isUrl(string) {
  const urlPattern = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-])*(\?[a-zA-Z0-9&=-]+)?(#[a-zA-Z0-9_-]+)?$/;
  return urlPattern.test(string);
}

export { dataConversionUtil }